import Foundation

//
//class CarProtocolBuilder {
//    static func buildCommand(
//        carType: UInt8 = 0x01,
//        functionCode: UInt8,
//        data: [UInt8] = []
//    ) -> Data {
//        // 1. 计算长度 = (数据字节数 + 1) * 2
//        let lengthValue = UInt8((data.count + 1) * 2)
//        
//        // 2. 计算校验和（从carType到数据结束）
//        var checksum = UInt16(carType)
//        checksum += UInt16(functionCode)
//        checksum += UInt16(lengthValue)
//        for byte in data {
//            checksum += UInt16(byte)
//        }
//        let checksumByte = UInt8(checksum & 0xFF)
//        
//        // 3. 构建完整协议数组
//        var fullBytes = [carType, functionCode, lengthValue]
//        fullBytes.append(contentsOf: data)
//        fullBytes.append(checksumByte)
//        
//        // 4. 转换为十六进制ASCII字符串
//        var hexString = "$"
//        for byte in fullBytes {
//            hexString += String(format: "%02X", byte)
//        }
//        hexString += "#"
//        
//        return hexString.data(using: .utf8) ?? Data()
//    }
//}

class CarProtocolBuilder {
    static func buildCommand(
        carType: UInt8 = 0x01,
        functionCode: UInt8,
        data: [UInt8] = [],
        fixedLength: UInt8? = nil  // 新增参数：固定长度值
    ) -> Data {
        // 1. 计算校验和（从carType到数据结束）
        var checksum = UInt16(carType)
        checksum += UInt16(functionCode)
        
        // 如果提供了固定长度，使用固定长度；否则计算默认长度
        let lengthValue: UInt8
        if let fixedLen = fixedLength {
            lengthValue = fixedLen
        } else {
            // 默认长度计算：数据字节数 + 1 (校验位)
            lengthValue = UInt8((data.count + 1) * 2)
        }
        
        checksum += UInt16(lengthValue)
        for byte in data {
            checksum += UInt16(byte)
        }
        let checksumByte = UInt8(checksum & 0xFF)
        
        // 2. 构建完整协议数组
        var fullBytes = [carType, functionCode, lengthValue]
        fullBytes.append(contentsOf: data)
        fullBytes.append(checksumByte)
        
        // 3. 转换为十六进制ASCII字符串
        var hexString = "$"
        for byte in fullBytes {
            hexString += String(format: "%02X", byte)
        }
        hexString += "#"
        
        return hexString.data(using: .utf8) ?? Data()
    }
}

